package com.foreknow.protals.service.impl;

import com.foreknow.protals.dao.PmsMemberPriceDao;
import com.foreknow.protals.dto.PmsProductParam;
import com.foreknow.protals.dto.PmsProductQueryParam;
import com.foreknow.protals.mbg.mapper.PmsMemberPriceMapper;
import com.foreknow.protals.mbg.mapper.PmsProductMapper;
import com.foreknow.protals.mbg.model.PmsMemberPrice;
import com.foreknow.protals.mbg.model.PmsProduct;
import com.foreknow.protals.service.PmsProductService;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Method;
import java.util.List;

@Service
public class PmsProductServiceImpl implements PmsProductService {
    private static final Logger LOGGER = LoggerFactory.getLogger(PmsProductServiceImpl.class);
    @Autowired
    private PmsProductMapper productMapper;

    @Autowired
    private PmsMemberPriceDao memberPriceDao;

    @Override
    public List<PmsProduct> list(PmsProductQueryParam productQueryParam, Integer pageSize, Integer pageNum) {
        return null;
    }

    @Override
    public int create(PmsProductParam productParam) {
        //1. 创建商品
        PmsProduct product = productParam;
        product.setId(null);
        productMapper.insertSelective(product);
        //2. 根据促销的类型设置价格：会员价格，阶梯价格，满减价格
        //2.1 获取到商品的ID
        Long productId = product.getId();
        //2.2 会员价格
        relateAndInsertList(memberPriceDao,productParam.getMemberPriceList(),productId);
        //2.3 阶梯价格
        //relateAndInsertList(dao,productParam.getProductLadderList(),productId);
        //2.4 满减价格
        //2.5 处理库存(sku_code: 201806070023001  年月日 + 四位的商品ID + 三位索引)
        //2.6 添加库存的信息
        //2.7 添加商品的参数以及自定义规格属性
        //2.8 关联专题
        //2.9 关联优选

        //思考的问题：
        // 1. 以上的这些操作是否有关联操作，如果有就需要创建dao和映射文件
        // 2. 如果每个操作都需要向关系表中插入数据，可以写一个共通的方法以达到代码的可重用
        return 0;
    }

    @Override
    public int update(Long id, PmsProductParam productParam) {
        return 0;
    }

    /**
     * 建立和插入关系表的操作
     * @param dao 可以操作的dao
     * @param dataList 要插入的数据
     * @param productId 建立关系的商品Id
     */
    private void relateAndInsertList(Object dao, List dataList, Long productId) {
        try {
            if(CollectionUtils.isEmpty(dataList)) {
                return;
            }
            for (Object item:dataList) {
                Method setId = item.getClass().getMethod("setId",Long.class);
                setId.invoke(item,null);
                //使用反射调用对象中的setProductId方法来设置商品的Id
                Method setProductId = item.getClass().getMethod("setProductId",Long.class);
                setProductId.invoke(item,productId);
            }
            Method insertList = dao.getClass().getMethod("insertList",List.class);
            insertList.invoke(dao,dataList);
        }catch(Exception e) {
            LOGGER.warn("创建商品出错",e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }
}
